# 模型类须继承自django.db models
# 这是django的ORM（对象关系映射）的核心设计
# ORM是将对象（object）面向对象编程中的实例 和 关系型数据库中的表进行相互转换的技术
from django.db import models
from django.utils import timezone
from re import T

# Create your models here.
# 编写数据表  数据表名称--》字段--》数据类型--》数据约束
# 数据表--》类名

# class ProductManager(models.Manager):
#     def create_product(self,product_name,cover,price):
#         """自定义创建逻辑"""
#         product = self.model(
#             product_name = product_name,
#             cover = cover,
#             price = price
#         )
#         product.save()
#         return product
#     pass

# 定义模型--》数据库表
# 继承Model类     ctrl+鼠标左键：查看继承的源代码
class Product(models.Model):
    # 字段--》类属性
    # 数据类型-->数据类型方法
    # 商品名称  unique=True,这个实例的值不能在其它实例创建时使用
    product_name = models.CharField(max_length=21,unique=True,verbose_name='商品名称')
    # 商品封面
    # 专门用于图片上传的字段,upload_to:保存到服务器具体文件 images文件名称
    cover = models.ImageField(upload_to='images',null=True,blank=True,verbose_name='封面图')
    # 商品价格-->不能写整数/浮点数
    price = models.DecimalField(max_digits=10,decimal_places=2,verbose_name='价格')
    # 热度
    popularity = models.IntegerField(default=0,verbose_name='热度/浏览量')
    # 库存管理
    stock = models.IntegerField(default=0,verbose_name='库存')
    # 商品状态
    is_active = models.BooleanField(default=False,verbose_name='是否上架')
    # 创建时间
    created_time = models.DateTimeField(default=timezone.now,verbose_name='创建时间')
    # 更新时间
    updated_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
    
    # 声明自定义管理器
    # objects = ProductManager()
    
    class Meta:
        # 是django模型的内部类
        # 作用:定义模型的元数据(metadata),关于模型的数据,元数据不会直接影响数据库字段,但控制模型的各种行为和特性
        # 自定义数据库表名 db_table
        db_table = 'product'
        # 设置中文名称
        verbose_name = '商品'
        # 指定模型对象复数形式
        verbose_name_plural = verbose_name
        
    def __str__(self):
        return f"商品名:{self.product_name}--状态:{self.is_active}"
    
    # 给库存+10
    def add_stock(self):
        print("给库存+10")
        return self.stock +10
        
    
# 店铺模型



# 评论模型  把两张表如何关联起来?  一个商品多个评论,一对多关系 外键关联   创建一个专门字段,product_id= Product表的id,关联模型的主键
class Review(models.Model):
    # 外键关联的字段   假设我的商品被删除,那么我的评论也删除(级联删除).
    product = models.ForeignKey(Product,on_delete=models.CASCADE,verbose_name='商品')
    
    username = models.CharField(max_length=21,verbose_name='用户名') 
    avatar = models.ImageField(upload_to='review_user',verbose_name='用户头像') 
    # 评论内容    长文本
    comment = models.TextField(verbose_name='评论内容')
    # 点赞量
    link_count = models.IntegerField(default=0,verbose_name='点赞量')
    # 评论时间
    created_time = models.DateTimeField(default=timezone.now,verbose_name='评论时间')
    # 更新时间
    updated_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
    
    class Meta:
        db_table = 'review'
        verbose_name = '评论'
        verbose_name_plural = verbose_name
    
    def __str__(self):
        return self.comment

# Product.objects.create_product(product_name="小米13Pro",
#                                cover="",
#                                price=100)